home *** CD-ROM | disk | FTP | other *** search
/ IRIX Installation Tools & Overlays 2001 November / SGI IRIX Installation Tools & Overlays 2001 November - Disc 3.iso / dist / cluster_services.idb / var / cluster / cmgr-scripts / haStatus.z / haStatus
Text File  |  2001-10-10  |  32KB  |  1,247 lines

  1. #!/bin/ksh
  2. #                                                                         
  3. #  Copyright (C) 1998, Silicon Graphics, Inc.                             
  4. #  All Rights Reserved.                                                   
  5. #                                                                         
  6. #  UNPUBLISHED -- Rights reserved under the copyright laws of the United  
  7. #  States.  Use of a copyright notice is precautionary only and does not  
  8. #  imply publication or disclosure.                                       
  9. #                                                                         
  10. #  THIS SOFTWARE CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION OF     
  11. #  SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, DISTRIBUTION, OR 
  12. #  DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN    
  13. #  PERMISSION OF SILICON GRAPHICS, INC.                                   
  14. #                                                                         
  15. #  U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND                               
  16. #  Use, duplication or disclosure by the Government is subject to         
  17. #  restrictions as set forth in FAR 52.227.19(c)(2) or subparagraph       
  18. #  (c)(1)(ii) of the Rights in Technical Data and Computer Software       
  19. #  clause at DFARS 252.227-7013 and/or in similar or successor clauses    
  20. #  in the FAR, or the DOD or NASA FAR Supplement.  Unpublished-- rights   
  21. #  reserved under the copyright laws of the United States.                
  22. #  Contractor/manufacturer is Silicon Graphics, Inc.,                     
  23. #  2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.                 
  24. #
  25. #
  26. # haStatus - This scripts prints the current state of all clusters, their
  27. #            nodes and their resource groups as configured in the cdb of
  28. #            the node on which this script is run.
  29. #         Detailed configuration information for all clusters, their
  30. #            nodes, resource groups, resources and failover policies, and for
  31. #            nodes which are in the pool but not in any cluster can be
  32. #            printed using the -i option.
  33. #            Using option -a all the information printed with -i option can
  34. #            be printed along with status information.
  35. #            See comments on USAGE below for details.
  36.  
  37. SCRIPT_NAME=`/usr/bin/basename $0`
  38.  
  39.  
  40. #
  41. # The usage string for this script.
  42. #
  43. # A brief status information is printed when no option is given. This includes:
  44. # 1. The cluster names and their status.
  45. # 2. The nodes in each cluster and their status.
  46. # 3. The resource groups in each cluster, their status and their resources.
  47. #
  48. # When -i option is used for this script, detailed configuration information
  49. # pertaining to all clusters in the cdb of the node on which this script is
  50. # run is printed:
  51. # 1. For each cluster defined in cdb, following information is printed:
  52. #    a. cluster name
  53. #    b. cluster notify cmd
  54. #    c. cluster notify address(es).
  55. #    d. The nodes in the cluster, their status, and their configuration
  56. #       information as printed by cmgr command show node A
  57. #    e. The resource groups in the cluster, their status, their failover
  58. #       policy, and their resources.
  59. #    f. A list of resources in the cluster with their state and their
  60. #       configuration information as printed by cmgr command show resource
  61. #       A of resource_type B.
  62. # 2. A list of failover policies in the cdb and their configuration
  63. #    information as printed by cmgr command show failover_policy A in cluster B.
  64. # 3. A list of nodes in the pool but not included in any cluster and their
  65. #    configuration information.
  66. #
  67. # The user can use option -a to all configuration information as printed by
  68. # option -i and status information for each item listed above for option -i
  69. # if applicable.
  70. #
  71. # The user can use option -c to print information for a specific cluster.
  72. # Information pertaining to only 1 cluster will be printed.
  73. #
  74. USAGESTR="\
  75. Usage: $SCRIPT_NAME [-a|-i] [-c clustername] \n\
  76. where,\n\
  77.  -a prints detailed cluster configuration information and cluster status.\n\
  78.  -i prints detailed cluster configuration information only.\n\
  79.  -c can be used to specify a cluster for which status is to be printed.\n\
  80.  \"clustername\" is the name of the cluster for which status is to be printed.\
  81. "
  82.  
  83.  
  84. #
  85. # CMGR_COMMAND_INTERPRETER - Full path name of the cluster_mgr application.
  86. # ** NOTE TO THE USER ** If cluster_mgr application is installed in non-default
  87. # location modify this variable to indicate the correct path
  88. #
  89. CMGR_COMMAND_INTERPRETER="/usr/cluster/bin/cluster_mgr"
  90.  
  91.  
  92.  
  93. # Temporary files needed by the script
  94.  
  95. #
  96. # CMGR_OUTPUT - The output from the cmgr commands is saved in this file.
  97. #
  98. CMGR_OUTPUT=/tmp/${SCRIPT_NAME}$$
  99. CMGR_ERROR=/tmp/${SCRIPT_NAME}$$.err
  100. CMGR_OUTPUT1=/tmp/${SCRIPT_NAME}$$.1
  101. CMGR_ERROR1=/tmp/${SCRIPT_NAME}$$.err.1
  102.  
  103. #
  104. # TMPFILE - Needed by function prependtab().
  105. #
  106. TMPFILE=/tmp/${SCRIPT_NAME}$$.tmp
  107.  
  108. #
  109. # SHOW_STATUS - Flag to indicate whether status information should be printed.
  110. #               Values: 0 - show status,   1 - do not show status
  111. #               Default value: 0  (show status).
  112. #
  113. SHOW_STATUS=0
  114.  
  115. #
  116. # SHOW_DETAILED_CONFIG - Flag to indicate whether detailed configuration
  117. #                        information should be printed.
  118. #               Values: 0 - show detailed,   1 - show brief
  119. #               Default value: 1  (show brief).
  120. #
  121. SHOW_DETAILED_CONFIG=1
  122.  
  123.  
  124. #
  125. # SHOW_ALL - Set to 0 when user specifies -a option to print detailed cluster
  126. #            configuration information and status.
  127. #
  128. SHOW_ALL=1
  129.  
  130. #
  131. # SHOW_CONFIG_ONLY - Set to 0 when user specifies -i option to print only the
  132. #                    detailed cluster configuration information. No status
  133. #                    information is printed. -a option overrides -i option.
  134. #
  135. SHOW_CONFIG_ONLY=1
  136.  
  137.  
  138. #############
  139. # FUNCTIONS #
  140. #############
  141.  
  142. #
  143. # signal_handler():
  144. #     Arguments: None
  145. #    Return value: None
  146. #    Description:
  147. #         Delete the temporary files and terminates this script. Invoked
  148. #               when user interrupts the script using signal 2 (SIGTERM).
  149. #
  150. function signal_handler
  151. {
  152.  
  153.     rm -f $CMGR_OUTPUT
  154.     rm -f $CMGR_ERROR
  155.     rm -f $CMGR_OUTPUT1
  156.     rm -f $CMGR_ERROR1
  157.     rm -f $TMPFILE
  158.  
  159.     exit 1
  160. }
  161.  
  162.  
  163. #
  164. # run_cmgr_command():
  165. #     Argument1: cmd - cluster_mgr command to be executed with cluster_mgr's
  166. #                        -c option
  167. #    Return Value: 0 always
  168. #    Description:
  169. #         Executes the cluster_mgr command.
  170. #        Deletes any blank lines from the output.
  171. #        Saves the result in $CMGR_OUTPUT file.
  172. #        Saves the stderr in $CMGR_ERROR file.
  173. #
  174. function run_cmgr_command
  175. {
  176.     cmd=$*
  177.  
  178.     rm -f $CMGR_OUTPUT
  179.     if [ -a $CMGR_OUTPUT ]; then
  180.         echo -n "Error: $SCRIPT_NAME: Couldn't remove "
  181.         echo    "temporary file ${CMGR_OUTPUT}."
  182.         exit 1
  183.     fi
  184.  
  185.     rm -f $CMGR_ERROR
  186.     if [ -a $CMGR_ERROR ]; then
  187.         echo -n "Error: $SCRIPT_NAME: Couldn't remove "
  188.         echo    "temporary file ${CMGR_ERROR}."
  189.         exit 1
  190.     fi
  191.  
  192.         
  193.     # Remove any blank lines from the cmgr output before saving it in
  194.     # $CMGR_OUTPUT file.
  195.     ${CMGR_COMMAND_INTERPRETER} -c "$cmd" 2>$CMGR_ERROR | \
  196.             sed -e '/^[   ]*$/d' > $CMGR_OUTPUT 2>/dev/null
  197.  
  198.     return 0
  199.  
  200. }
  201.  
  202.  
  203. #
  204. # prependtab():
  205. #     Argument1: filename - Name of the a text file
  206. #    Return Value: 0 always
  207. #    Description:
  208. #         Adds eight spaces at the beginning of each line in file
  209. #        filename.
  210. #
  211. function prependtab
  212. {
  213.     filename=$1
  214.  
  215.     rm -f $TMPFILE
  216.  
  217.         if [ -a $TMPFILE ]; then
  218.                 echo -n "Error: $SCRIPT_NAME: Couldn't remove temporary "
  219.         echo    "file ${TMPFILE}."
  220.                 exit 1
  221.         fi
  222.  
  223.     sed -n -e 's/^/        /p' $filename > $TMPFILE
  224.     mv -f $TMPFILE $filename
  225.     return 0
  226. }
  227.  
  228.  
  229.  
  230. #
  231. # get_clusters():
  232. #     Arguments: None
  233. #    Input: None
  234. #    Return Value: 0 on success, 1 on failure.
  235. #    Output: Array CLUSTER[] and Variable NUMCLUSTERS
  236. #    Description:
  237. #        Obtains list of clusters defined in cdb using cmgr command
  238. #               show clusters. Saves the cluster names in array CLUSTER[]
  239. #               and the number of clusters in variable NUMCLUSTERS.
  240. #
  241. function get_clusters
  242. {
  243.     # Obtain the list of clusters configured using cmgr show clusters.
  244.  
  245.     run_cmgr_command show clusters
  246.  
  247.     # Syntax of the output of the show clusters command when successful is:
  248.     #    N Cluster(s) defined
  249.     #        clustername1
  250.     #        clustername2
  251.     #        ....
  252.     #        clusternameN
  253.  
  254.     # When <= 1 line in the $CMGR_OUTPUT file, it implies that cmgr show
  255.     # clusters was unsuccessful.
  256.     NUMLINES=`cat $CMGR_OUTPUT | wc -l`
  257.     if [ $NUMLINES -le 1 ]; then
  258.         echo "Error: $SCRIPT_NAME: Could not get the list of clusters."
  259.         cat $CMGR_ERROR
  260.         cat $CMGR_OUTPUT
  261.         rm -f $CMGR_OUTPUT
  262.         rm -f $CMGR_ERROR
  263.         return 1
  264.     fi
  265.  
  266.  
  267.     # Confirm that from the second line to the end of file, you have a
  268.     # list of clusters, by confirming that there is 1 word in each
  269.     # non-blank line. Otherwise, it can be safely assumed to be an error
  270.     # message.
  271.     while [ $NUMLINES -gt 1 ]
  272.     do
  273.         NUMWORDS=`cat $CMGR_OUTPUT | sed -n -e "${NUMLINES}p" | wc -w`
  274.         if [ $NUMWORDS -gt 1 ]; then
  275.             echo -n "Error: $SCRIPT_NAME: Could not get "
  276.             echo    "the list of clusters."
  277.             cat $CMGR_ERROR
  278.             cat $CMGR_OUTPUT
  279.             rm -f $CMGR_OUTPUT
  280.             rm -f $CMGR_ERROR
  281.             return 1
  282.         fi
  283.  
  284.         NUMLINES=`expr $NUMLINES - 1`
  285.     done
  286.  
  287.     # Save the clusters in the CLUSTER array and number of clusters in
  288.     # NUMCLUSTERS variable.
  289.     clusteridx=0
  290.     for cluster in `cat $CMGR_OUTPUT | sed -e '1d'`
  291.     do
  292.         CLUSTER[$clusteridx]=$cluster
  293.         clusteridx=`expr $clusteridx + 1`
  294.     done
  295.  
  296.     NUMCLUSTERS=$clusteridx
  297.  
  298.     # Make sure that clusters were obtained.
  299.     if [ $NUMCLUSTERS -le 0 ]; then
  300.         echo "Error: $SCRIPT_NAME: Could not get the list of clusters."
  301.         cat $CMGR_ERROR
  302.         cat $CMGR_OUTPUT
  303.         rm -f $CMGR_OUTPUT
  304.         rm -f $CMGR_ERROR
  305.         return 1
  306.     fi
  307.  
  308.     cat $CMGR_ERROR
  309.  
  310.     rm -f $CMGR_OUTPUT
  311.     rm -f $CMGR_ERROR
  312.  
  313.     return 0
  314. }
  315.  
  316.  
  317. #
  318. # get_cluster_nodes():
  319. #     Arguments: None
  320. #    Input: Variable CLUSTER_NAME containing the name of the cluster.
  321. #    Return Value: 0 on success, 1 on failure
  322. #    Output: Array NODE[] and Variable NUMNODES
  323. #    Description:
  324. #        Obtains list of nodes in cluster $CLUSTER_NAME.
  325. #               Saves the node names in array NODE[] and the number of
  326. #               nodes in variable NUMNODES.
  327. #
  328. function get_cluster_nodes
  329. {
  330.     run_cmgr_command show nodes in cluster $CLUSTER_NAME
  331.  
  332.     # Syntax of the $CMGR_OUTPUT file when above command successful is
  333.     #    Cluster test-cluster has following N machine(s)
  334.     #        nodename1
  335.     #        nodename2
  336.     #        ....
  337.     #        nodenameN
  338.  
  339.     # When <= 1 line in the $CMGR_OUTPUT file, it implies that cmgr show
  340.     # nodes in cluster was unsuccessful.
  341.     NUMLINES=`cat $CMGR_OUTPUT | wc -l`
  342.     if [ $NUMLINES -le 1 ]; then
  343.         echo -n "Error: $SCRIPT_NAME: Could not determine the nodes "
  344.         echo    "in the cluster ${CLUSTER_NAME}."
  345.         cat $CMGR_ERROR
  346.         cat $CMGR_OUTPUT
  347.         rm -f $CMGR_OUTPUT
  348.         rm -f $CMGR_ERROR
  349.         return 1
  350.     fi
  351.  
  352.  
  353.     # Confirm that from the second line to the end of file, you have a
  354.     # list of nodes, by confirming that there is 1 word in each non-blank
  355.     # line. Otherwise, it can be safely assumed to be an error message.
  356.     while [ $NUMLINES -gt 1 ]
  357.     do
  358.         NUMWORDS=`cat $CMGR_OUTPUT | sed -n -e "${NUMLINES}p" | wc -w`
  359.         if [ $NUMWORDS -gt 1 ]; then
  360.             echo -n "Error: $SCRIPT_NAME: Could not determine "
  361.             echo    "the nodes in the cluster ${CLUSTER_NAME}."
  362.             cat $CMGR_ERROR
  363.             cat $CMGR_OUTPUT
  364.             rm -f $CMGR_OUTPUT
  365.             rm -f $CMGR_ERROR
  366.             return 1
  367.         fi
  368.  
  369.         NUMLINES=`expr $NUMLINES - 1`
  370.     done
  371.  
  372.     # Save the nodes in the NODE array and number of nodes in NUMNODES
  373.     # variable.
  374.     nodeidx=0
  375.     for node in `cat $CMGR_OUTPUT | sed -e '1d'`
  376.     do
  377.         NODE[$nodeidx]=$node
  378.         nodeidx=`expr $nodeidx + 1`
  379.     done
  380.     NUMNODES=$nodeidx
  381.  
  382.     # Make sure that NODES were obtained.
  383.     if [ $NUMNODES -le 0 ]; then
  384.         echo -n "Error: $SCRIPT_NAME: Could not determine the nodes "
  385.         echo    "in the cluster ${CLUSTER_NAME}."
  386.         cat $CMGR_ERROR
  387.         cat $CMGR_OUTPUT
  388.         rm -f $CMGR_OUTPUT
  389.         rm -f $CMGR_ERROR
  390.         return 1
  391.     fi
  392.  
  393.     # Append the list of nodes to CNODES[] array. This information will
  394.     # be later used to determine the nodes which are in the pool but are
  395.     # not in any cluster.
  396.     nodeidx=0
  397.     cnodeidx=$NUMCNODES
  398.     while [ $nodeidx -lt $NUMNODES ]
  399.     do
  400.         CNODE[$cnodeidx]=${NODE[$nodeidx]}
  401.         cnodeidx=`expr $cnodeidx + 1`
  402.         nodeidx=`expr $nodeidx + 1`
  403.     done
  404.     NUMCNODES=$cnodeidx
  405.  
  406.     cat $CMGR_ERROR
  407.  
  408.     rm -f $CMGR_OUTPUT
  409.     rm -f $CMGR_ERROR
  410.  
  411.     return 0
  412. }
  413.  
  414.  
  415. #
  416. # get_resource_groups_in_cluster():
  417. #     Arguments: None
  418. #    Input: Variable CLUSTER_NAME containing the name of the cluster.
  419. #    Return Value: 0 on success, 1 on failure
  420. #    Output: Array GROUP[] and Variable NUMGROUPS
  421. #    Description:
  422. #        Obtains list of resource groups in cluster $CLUSTER_NAME.
  423. #               Saves the resource group names in array GROUP[] and the
  424. #               number of resource groups in variable NUMGROUPS.
  425. #
  426. function get_resource_groups_in_cluster
  427. {
  428.     run_cmgr_command show resource_groups in cluster $CLUSTER_NAME
  429.  
  430.     # Syntax of the $CMGR_OUTPUT file when the show resource_groups command
  431.     # above is successful
  432.     #
  433.     #    Resource Groups: 
  434.     #        resource_group1
  435.     #        resource_group2
  436.     #        ....
  437.     #        resource_groupN
  438.  
  439.     # When <= 1 line in the $CMGR_OUTPUT file, it implies that
  440.     # show resource_groups in cluster was unsuccessful.
  441.     NUMLINES=`cat $CMGR_OUTPUT | wc -l`
  442.     if [ $NUMLINES -le 1 ]; then
  443.         echo -n "Warning: $SCRIPT_NAME: Could not determine "
  444.         echo    "resource groups in the cluster ${CLUSTER_NAME}."
  445.         cat $CMGR_ERROR
  446.         cat $CMGR_OUTPUT
  447.         echo " "; echo " "
  448.         rm -f $CMGR_OUTPUT
  449.         rm -f $CMGR_ERROR
  450.         return 1
  451.     fi
  452.  
  453.  
  454.     # Confirm that from the second line to the end of file, you have
  455.     # a list of resource groups, by confirming that there is 1 word in
  456.     # each non-blank line. Otherwise, it can be safely assumed to be
  457.     # an error message.
  458.     while [ $NUMLINES -gt 1 ]
  459.     do
  460.         NUMWORDS=`cat $CMGR_OUTPUT | sed -n -e "${NUMLINES}p" | wc -w`
  461.         if [ $NUMWORDS -gt 1 ]; then
  462.             echo -n "Warning: $SCRIPT_NAME: Could not determine "
  463.             echo -n "resource groups in the cluster "
  464.             echo    "${CLUSTER_NAME}."
  465.             cat $CMGR_ERROR
  466.             cat $CMGR_OUTPUT
  467.             echo " "; echo " "
  468.             rm -f $CMGR_OUTPUT
  469.             rm -f $CMGR_ERROR
  470.             return 1
  471.         fi
  472.  
  473.         NUMLINES=`expr $NUMLINES - 1`
  474.     done
  475.  
  476.     # Save the resource_group names in the GROUP[] array, and number
  477.     # of resource groups in NUMGROUPS variable
  478.     grpidx=0
  479.     for resgroup in `cat $CMGR_OUTPUT | sed -e '1d'`
  480.     do
  481.         GROUP[$grpidx]=$resgroup
  482.         grpidx=`expr $grpidx + 1`
  483.     done
  484.  
  485.     NUMGROUPS=$grpidx
  486.  
  487.     # Confirm that the resource groups were obtained.
  488.     if [ $NUMGROUPS -eq 0 ]; then
  489.         echo -n "Warning: $SCRIPT_NAME: Could not determine "
  490.         echo    "resource groups in the cluster ${CLUSTER_NAME}."
  491.         cat $CMGR_ERROR
  492.         cat $CMGR_OUTPUT
  493.         echo " "; echo " "
  494.         rm -f $CMGR_OUTPUT
  495.         rm -f $CMGR_ERROR
  496.         return 1
  497.     fi
  498.  
  499.     cat $CMGR_ERROR
  500.  
  501.     rm -f $CMGR_OUTPUT
  502.     rm -f $CMGR_ERROR
  503.  
  504.     return 0
  505. }
  506.  
  507.  
  508. #
  509. # get_and_print_resources_in_cluster():
  510. #     Arguments: None
  511. #    Input: Variable CLUSTER_NAME containing the name of the cluster.
  512. #    Return Value: 0 on success, 1 on failure
  513. #    Output:None
  514. #    Description:
  515. #        Obtains list of resources in cluster $CLUSTER_NAME by
  516. #        first obtaining a list of resource_types in the cluster
  517. #        and then all resources of each resource_type in the cluster.
  518. #               Prints the status (if requested) and details of each resource.
  519. #
  520. function get_and_print_resources_in_cluster
  521. {
  522.     run_cmgr_command show resource_types in cluster $CLUSTER_NAME
  523.  
  524.     # Syntax of the $CMGR_OUTPUT file when the show resource_types command
  525.     # above is successful
  526.     #
  527.     #        resource_type1
  528.     #        resource_type2
  529.     #        ....
  530.     #        resource_typeN
  531.  
  532.  
  533.     # Confirm that from the first line to the end of file, you have
  534.     # a list of resource types, by confirming that there is 1 word in
  535.     # each non-blank line. Otherwise, it can be safely assumed to be
  536.     # an error message.
  537.     NUMLINES=`cat $CMGR_OUTPUT | wc -l`
  538.     while [ $NUMLINES -gt 0 ]
  539.     do
  540.         NUMWORDS=`cat $CMGR_OUTPUT | sed -n -e "${NUMLINES}p" | wc -w`
  541.         if [ $NUMWORDS -gt 1 ]; then
  542.             echo -n "Warning: $SCRIPT_NAME: Could not determine "
  543.             echo -n "resource types in the cluster "
  544.             echo    "${CLUSTER_NAME}."
  545.             cat $CMGR_ERROR
  546.             cat $CMGR_OUTPUT
  547.             echo " "; echo " "
  548.             rm -f $CMGR_OUTPUT
  549.             rm -f $CMGR_ERROR
  550.             return 1
  551.         fi
  552.  
  553.         NUMLINES=`expr $NUMLINES - 1`
  554.     done
  555.  
  556.     cat $CMGR_ERROR
  557.  
  558.     rm -f $CMGR_ERROR
  559.  
  560.     # Obtain the resources of each resource_type in the cluster
  561.     NUMRESOURCES=0
  562.     for restype in `cat $CMGR_OUTPUT`
  563.     do
  564.         run_cmgr_command show resources of resource_type $restype \
  565.                         in cluster $CLUSTER_NAME
  566.         
  567.  
  568.         # Syntax of the $CMGR_OUTPUT file when the show resources of
  569.         # resource_type command above is successful
  570.         #
  571.         #        res1 type resource_type
  572.         #        res2 type resource_type
  573.         #        ....
  574.         #        resN type resource_type
  575.  
  576.         # Save the CMGR_OUTPUT and CMGR_ERROR files
  577.         rm -f $CMGR_OUTPUT1
  578.         if [ -a $CMGR_OUTPUT1 ]; then
  579.             echo -n "Error: $SCRIPT_NAME: Couldn't remove "
  580.             echo    "temporary file ${CMGR_OUTPUT1}."
  581.             exit 1
  582.         fi
  583.         mv -f $CMGR_OUTPUT $CMGR_OUTPUT1
  584.  
  585.         rm -f $CMGR_ERROR1
  586.         if [ -a $CMGR_ERROR1 ]; then
  587.             echo -n "Error: $SCRIPT_NAME: Couldn't remove "
  588.             echo    "temporary file ${CMGR_ERROR1}."
  589.             exit 1
  590.         fi
  591.         mv -f $CMGR_ERROR $CMGR_ERROR1
  592.  
  593.         # Confirm that from the first line to the end of file, you have
  594.         # a list of resources, by confirming that there are 3 words in
  595.         # each line, where the second and 3rd words are
  596.         # "type" and $restype respectively.
  597.         # Otherwise, it can be safely assumed to be an error message.
  598.         NUMLINES=`cat $CMGR_OUTPUT1 | wc -l`
  599.         while [ $NUMLINES -gt 0 ]
  600.         do
  601.             LINE=`cat $CMGR_OUTPUT1 | sed -n -e "${NUMLINES}p"`
  602.             NUMWORDS=`echo $LINE | wc -w`
  603.             if [ $NUMWORDS -ne 3 ]; then
  604.                 echo -n "Warning: $SCRIPT_NAME: Could not "
  605.                 echo -n "determine resources of resource_type "
  606.                 echo -n "$restype in the cluster "
  607.                 echo    "${CLUSTER_NAME}."
  608.                 cat $CMGR_ERROR1
  609.                 cat $CMGR_OUTPUT1
  610.                 echo " "; echo " "
  611.                 rm -f $CMGR_OUTPUT1
  612.                 rm -f $CMGR_ERROR1
  613.                 return 1
  614.             fi
  615.  
  616.             SECOND_AND_THIRD_WORD=`echo $LINE | awk '{print $2 $3}'`
  617.             if [ "a$SECOND_AND_THIRD_WORD" != \
  618.                         "atype$restype" ]; then
  619.                 echo -n "Warning: $SCRIPT_NAME: Could not "
  620.                 echo -n "determine resources of resource_type "
  621.                 echo -n "$restype in the cluster "
  622.                 echo    "${CLUSTER_NAME}."
  623.                 cat $CMGR_ERROR1
  624.                 cat $CMGR_OUTPUT1
  625.                 echo " "; echo " "
  626.                 rm -f $CMGR_OUTPUT1
  627.                 rm -f $CMGR_ERROR1
  628.                 return 1
  629.             fi
  630.  
  631.  
  632.             # Get and print status of the resource and its details.
  633.             RESOURCE="`echo $LINE | awk '{print $1}'`"
  634.             echo "Resource $RESOURCE (type ${restype}):"
  635.             echo " "
  636.  
  637.             # Print resource status.
  638.             if [ $SHOW_STATUS -eq 0 ]; then
  639.                 run_cmgr_command show status of resource \
  640.                     $RESOURCE of resource_type $restype \
  641.                         in cluster $CLUSTER_NAME
  642.                 prependtab $CMGR_OUTPUT
  643.                 cat $CMGR_ERROR
  644.                 cat $CMGR_OUTPUT
  645.                 rm -f $CMGR_OUTPUT
  646.                 rm -f $CMGR_ERROR
  647.                 echo " "
  648.             fi
  649.  
  650.  
  651.             # Print resource details.
  652.             run_cmgr_command show resource $RESOURCE \
  653.                         of resource_type $restype
  654.             prependtab $CMGR_OUTPUT
  655.             cat $CMGR_ERROR
  656.             cat $CMGR_OUTPUT
  657.             rm -f $CMGR_OUTPUT
  658.             rm -f $CMGR_ERROR
  659.             echo " "
  660.  
  661.             NUMRESOURCES=`expr $NUMRESOURCES + 1`
  662.  
  663.             echo " "
  664.  
  665.             NUMLINES=`expr $NUMLINES - 1`
  666.  
  667.         done
  668.         cat $CMGR_ERROR1
  669.         rm -f $CMGR_OUTPUT1
  670.         rm -f $CMGR_ERROR1
  671.     done
  672.     
  673.  
  674.     # Confirm that the resources were obtained.
  675.     if [ $NUMRESOURCES -le 0 ]; then
  676.         echo -n "Warning: $SCRIPT_NAME: Could not determine resources "
  677.         echo    "in the cluster ${CLUSTER_NAME}."
  678.         echo " "; echo " "
  679.         return 1
  680.     fi
  681.  
  682.     return 0
  683. }
  684.  
  685.  
  686.  
  687. #
  688. # get_failover_policies():
  689. #     Arguments: None
  690. #    Input: None
  691. #    Return Value: 0 on success, 1 on failure
  692. #    Output: Array  FAILOVER_POLICY[] and Variable NUMPOLICIES
  693. #    Description:
  694. #        Obtains list of failover policies defined in cdb using
  695. #               cmgr command show failover_policies.
  696. #               Saves the failover policy names in array FAILOVER_POLICY[]
  697. #               and the number of failover policies in variable NUMPOLICIES.
  698. #
  699. function get_failover_policies
  700. {
  701.  
  702.     run_cmgr_command show failover_policies
  703.  
  704.     # Syntax of the output of the show failover_policies which is saved in
  705.     # $CMGR_OUTPUT file:
  706.     #
  707.     #    Failover Policies:
  708.     #        failover-policy1
  709.     #        failover-policy2
  710.     #        ....
  711.     #        failover-policyN
  712.  
  713.     # When <= 1 line in the $CMGR_OUTPUT file, it implies that show
  714.     # failover_policies command was unsuccessful.
  715.     NUMLINES=`cat $CMGR_OUTPUT | wc -l`
  716.     if [ $NUMLINES -le 1 ]; then
  717.         echo -n "Warning: $SCRIPT_NAME: Could not determine "
  718.         echo    "the failover_policies."
  719.         cat $CMGR_ERROR
  720.         cat $CMGR_OUTPUT
  721.         echo " "; echo " "
  722.         rm -f $CMGR_OUTPUT
  723.         rm -f $CMGR_ERROR
  724.         return 1
  725.     fi
  726.  
  727.     # Confirm that from the second line to the end of file, you have a list
  728.     # of failover policies, by confirming that there is 1 word in each
  729.     # non-blank line. Otherwise, it can be safely assumed to be an error
  730.     # message.
  731.     while [ $NUMLINES -gt 1 ]
  732.     do
  733.         NUMWORDS=`cat $CMGR_OUTPUT | sed -n -e "${NUMLINES}p" | wc -w`
  734.         if [ $NUMWORDS -gt 1 ]; then
  735.             echo -n "Warning: $SCRIPT_NAME: Could not determine "
  736.             echo    "the failover_policies."
  737.             cat $CMGR_ERROR
  738.             cat $CMGR_OUTPUT
  739.             echo " "; echo " "
  740.             rm -f $CMGR_OUTPUT
  741.             rm -f $CMGR_ERROR
  742.             return 1
  743.         fi
  744.  
  745.         NUMLINES=`expr $NUMLINES - 1`
  746.     done
  747.  
  748.     # Save the failover policies in array FAILOVER_POLICY[] and number of
  749.     # failover policies in variable NUMPOLICIES
  750.     policyidx=0
  751.     for policy in `cat $CMGR_OUTPUT | sed -e '1d'`
  752.     do
  753.         FAILOVER_POLICY[$policyidx]=$policy
  754.         policyidx=`expr $policyidx + 1`
  755.     done
  756.  
  757.     NUMPOLICIES=$policyidx
  758.  
  759.     # Confirm that failover policies were obtained.
  760.     if [ $NUMPOLICIES -eq 0 ]; then
  761.         echo -n "Warning: $SCRIPT_NAME: Could not determine "
  762.         echo    "the failover_policies."
  763.         cat $CMGR_ERROR
  764.         cat $CMGR_OUTPUT
  765.         echo " "; echo " "
  766.         rm -f $CMGR_OUTPUT
  767.         rm -f $CMGR_ERROR
  768.         return 1
  769.     fi
  770.  
  771.     cat $CMGR_ERROR
  772.  
  773.     rm -f $CMGR_OUTPUT
  774.     rm -f $CMGR_ERROR
  775.     return 0
  776. }
  777.  
  778.  
  779. #
  780. # get_pool_nodes():
  781. #       Arguments: None
  782. #       Input: None
  783. #       Return Value: 0 on success, 1 on failure
  784. #       Output: Array NODE[] and Variable NUMNODES
  785. #       Description:
  786. #               Obtains list of nodes in the pool.
  787. #               Saves the node names in array NODE[] and the number of
  788. #               nodes in variable NUMNODES.
  789. #
  790. function get_pool_nodes
  791. {
  792.  
  793.     run_cmgr_command show nodes in pool
  794.  
  795.     # Syntax of the output of the show nodes in pool which is saved in
  796.     # $CMGR_OUTPUT file:
  797.     #
  798.     #    N Machine(s) defined
  799.     #            node1
  800.     #        node2
  801.     #        ...
  802.     #        nodeN
  803.  
  804.  
  805.     # When <= 1 line in the $CMGR_OUTPUT file, it implies that show
  806.     # nodes in pool command was unsuccessful.
  807.     NUMLINES=`cat $CMGR_OUTPUT | wc -l`
  808.     if [ $NUMLINES -le 1 ]; then
  809.         echo -n "Error: $SCRIPT_NAME: Could not determine "
  810.         echo    "the nodes in the pool."
  811.         cat $CMGR_ERROR
  812.         cat $CMGR_OUTPUT
  813.         rm -f $CMGR_OUTPUT
  814.         rm -f $CMGR_ERROR
  815.         return 1
  816.     fi
  817.  
  818.     # Confirm that from the second line to the end of file, you have a list
  819.     # of nodes, by confirming that there is 1 word in each non-blank line.
  820.     # Otherwise, it can be safely assumed to be an error message.
  821.     while [ $NUMLINES -gt 1 ]
  822.     do
  823.         NUMWORDS=`cat $CMGR_OUTPUT | sed -n -e "${NUMLINES}p" | wc -w`
  824.         if [ $NUMWORDS -gt 1 ]; then
  825.             echo -n "Error: $SCRIPT_NAME: Could not determine "
  826.             echo    "the nodes in the pool."
  827.             cat $CMGR_ERROR
  828.             cat $CMGR_OUTPUT
  829.             rm -f $CMGR_OUTPUT
  830.             rm -f $CMGR_ERROR
  831.             return 1
  832.         fi
  833.  
  834.         NUMLINES=`expr $NUMLINES - 1`
  835.     done
  836.  
  837.     # Save the nodes in array NODE[] and number of nodes in
  838.     # NUMNODES variable.
  839.     nodeidx=0
  840.     for node in `cat $CMGR_OUTPUT | sed -e '1d'`
  841.     do
  842.         NODE[$nodeidx]=$node
  843.         nodeidx=`expr $nodeidx + 1`
  844.     done
  845.  
  846.     NUMNODES=$nodeidx
  847.  
  848.     # Confirm that nodes were obtained.
  849.     if [ $NUMNODES -le 0 ]; then
  850.         echo -n "Error: $SCRIPT_NAME: Could not determine "
  851.         echo    "the nodes in the pool."
  852.         cat $CMGR_ERROR
  853.         cat $CMGR_OUTPUT
  854.         rm -f $CMGR_OUTPUT
  855.         rm -f $CMGR_ERROR
  856.         return 1
  857.     fi
  858.  
  859.     cat $CMGR_ERROR
  860.  
  861.     rm -f $CMGR_OUTPUT
  862.     rm -f $CMGR_ERROR
  863.     return 0
  864. }
  865.  
  866.  
  867. ################
  868. # MAIN SECTION #
  869. ################
  870.  
  871.  
  872. #
  873. # When interrupted by user, remove temporary files and exit
  874. #
  875. trap signal_handler 2
  876.  
  877.  
  878. #
  879. # Process the command line arguments
  880. #
  881. while getopts aic:h  c
  882. do
  883.     case $c in
  884.         a)        SHOW_ALL=0;;
  885.         i)        SHOW_CONFIG_ONLY=0;;
  886.         c)        CLUSTER_NAME=$OPTARG;;
  887.         h | \?)        echo $USAGESTR
  888.                 exit 1;;
  889.     esac
  890.  
  891. done
  892.  
  893. echo " "
  894. date
  895. echo " "
  896.  
  897. # Option -a always overrides option -i.
  898. if [ $SHOW_ALL -eq 0 ]; then
  899.     SHOW_STATUS=0
  900.     SHOW_DETAILED_CONFIG=0
  901. elif [ $SHOW_CONFIG_ONLY -eq 0 ]; then
  902.     SHOW_STATUS=1
  903.     SHOW_DETAILED_CONFIG=0
  904. fi
  905.  
  906. # If the user specified a cluster name, save it as the the only cluster
  907. # in the list of clusters and proceed. Else, obtain the list of clusters.
  908. if [ "a$CLUSTER_NAME" != "a" ]; then
  909.     CLUSTER[0]=$CLUSTER_NAME
  910.     NUMCLUSTERS=1
  911. else
  912.     get_clusters
  913.     if [ $? -ne 0 ]; then
  914.         # No cluster names could be obtained. Exit.
  915.         # Error message is printed and cleanup is done in get_clusters
  916.         exit 1
  917.     fi
  918. fi
  919.  
  920. echo " "
  921. clusteridx=0
  922. # At the end of following while loop NUMCNODES will contain the
  923. # number of nodes in all cluster if detailed configuration
  924. # information is requested. CNODE[] will have a list of nodes in
  925. # all clusters.
  926. NUMCNODES=0 # Updated by get_cluster_nodes
  927. while [ $clusteridx -lt $NUMCLUSTERS ]
  928. do
  929.  
  930.     CLUSTER_NAME=${CLUSTER[$clusteridx]}
  931.  
  932.  
  933.     echo "Cluster ${CLUSTER_NAME}:"
  934.     echo " "
  935.  
  936.  
  937.  
  938.     # Print status of cluster
  939.     if [ $SHOW_STATUS -eq 0 ]; then
  940.         run_cmgr_command show status of cluster $CLUSTER_NAME
  941.         prependtab $CMGR_OUTPUT
  942.         cat $CMGR_ERROR
  943.         cat $CMGR_OUTPUT
  944.         rm -f $CMGR_OUTPUT
  945.         rm -f $CMGR_ERROR
  946.         echo " "
  947.     fi
  948.  
  949.  
  950.     # If detailed configuration information requested, print
  951.     # Cluster Notify Cmd and Address
  952.  
  953.     if [ $SHOW_DETAILED_CONFIG -eq 0 ]; then
  954.         run_cmgr_command show cluster $CLUSTER_NAME
  955.         prependtab $CMGR_OUTPUT
  956.         cat $CMGR_ERROR
  957.         cat $CMGR_OUTPUT | sed -n -e '/Cluster Notify/p'
  958.         rm -f $CMGR_OUTPUT
  959.         rm -f $CMGR_ERROR
  960.         echo " "
  961.     fi
  962.  
  963.  
  964.     echo " "
  965.  
  966.  
  967.     #
  968.     # Obtain the nodes in the cluster in NODE[] array and number of
  969.     # nodes in NUMNODES variable.
  970.     #
  971.     get_cluster_nodes
  972.     if [ $? -ne 0 ]; then
  973.         # Nodes could not be found skip to next cluster.
  974.         # Error message printed and any cleanup done by
  975.         # function get_cluster_nodes.
  976.         echo " "
  977.         echo " ...skipping cluster $CLUSTER_NAME"
  978.         echo " "
  979.         clusteridx=`expr $clusteridx + 1`
  980.         continue
  981.     fi
  982.  
  983.  
  984.     #
  985.     # Get and print the status of each node.
  986.     #
  987.  
  988.     #if [ $NUMNODES -eq 1 ]; then
  989.     #    echo The $NUMNODES node in the cluster and its state is:
  990.     #else
  991.     #    echo The $NUMNODES nodes in the cluster and their states are:
  992.     #fi
  993.     #echo " "
  994.  
  995.     nodeidx=0
  996.     while [ $nodeidx -lt $NUMNODES ]
  997.     do
  998.         echo "Node ${NODE[$nodeidx]}:"
  999.         echo " "
  1000.  
  1001.         # Print status of node.
  1002.         if [ $SHOW_STATUS -eq 0 ]; then
  1003.             run_cmgr_command show status of node ${NODE[$nodeidx]}
  1004.             prependtab $CMGR_OUTPUT
  1005.             cat $CMGR_ERROR
  1006.             cat $CMGR_OUTPUT
  1007.             rm -f $CMGR_OUTPUT
  1008.             rm -f $CMGR_ERROR
  1009.             echo " "
  1010.         fi
  1011.  
  1012.         # If user has requested detailed information, show details
  1013.         # of each node
  1014.         if [ $SHOW_DETAILED_CONFIG -eq 0 ]; then
  1015.             run_cmgr_command show node ${NODE[$nodeidx]}
  1016.             prependtab $CMGR_OUTPUT
  1017.             cat $CMGR_ERROR
  1018.             cat $CMGR_OUTPUT
  1019.             rm -f $CMGR_OUTPUT
  1020.             rm -f $CMGR_ERROR
  1021.             echo " "
  1022.         fi
  1023.  
  1024.  
  1025.         echo " "
  1026.  
  1027.         nodeidx=`expr $nodeidx + 1`
  1028.     done
  1029.  
  1030.     #
  1031.     # Obtain the resource groups in the cluster.
  1032.     #
  1033.     get_resource_groups_in_cluster
  1034.     if [ $? -eq 0 ]; then  #resource_groups found
  1035.         #
  1036.         # Get and print the status of each resource group.
  1037.         #
  1038.  
  1039.         grpidx=0
  1040.         while [ $grpidx -lt $NUMGROUPS ]
  1041.         do
  1042.             echo "Resource_group ${GROUP[$grpidx]}:"
  1043.             echo " "
  1044.  
  1045.             # Show resource group status.
  1046.             if [ $SHOW_STATUS -eq 0 ]; then
  1047.                 run_cmgr_command show status of resource_group \
  1048.                     ${GROUP[$grpidx]} in cluster \
  1049.                         $CLUSTER_NAME
  1050.                 prependtab $CMGR_OUTPUT
  1051.                 cat $CMGR_ERROR
  1052.                 cat $CMGR_OUTPUT 
  1053.                 rm -f $CMGR_OUTPUT
  1054.                 rm -f $CMGR_ERROR
  1055.                 echo " "
  1056.             fi
  1057.  
  1058.             # Always show the resource group's failover policy
  1059.             run_cmgr_command show resource_group \
  1060.                 ${GROUP[$grpidx]} in cluster $CLUSTER_NAME
  1061.             # Get failover_policy name
  1062.             fp_name=`awk -F: \
  1063.                 '$1 ~ /Failover Policy/ {printf ("%s", $2)}' \
  1064.                     $CMGR_OUTPUT | sed -e 's/\ //g'`
  1065.             if [ "a$fp_name" = "a" ]; then
  1066.                         echo -n "Warning: $SCRIPT_NAME: Could not "
  1067.                 echo -n "determine the failover_policy "
  1068.                 echo    "for this resource_group."
  1069.                 cat $CMGR_ERROR
  1070.                 cat $CMGR_OUTPUT
  1071.                 rm -f $CMGR_OUTPUT
  1072.                 rm -f $CMGR_ERROR
  1073.             else
  1074.  
  1075.                 cat $CMGR_ERROR
  1076.  
  1077.                 rm -f $CMGR_OUTPUT
  1078.                 rm -f $CMGR_ERROR
  1079.  
  1080.                 # If the user requested detailed information
  1081.                 # obtain the failover policy info
  1082.                 if [ $SHOW_DETAILED_CONFIG -eq 0 ]; then
  1083.                     run_cmgr_command show failover_policy \
  1084.                                 ${fp_name}
  1085.                     prependtab $CMGR_OUTPUT
  1086.                 fi
  1087.  
  1088.                 # Print the failover_policy name
  1089.                 echo "\tFailover Policy: $fp_name"
  1090.  
  1091.                 # Now print the failover policy info
  1092.                 # if the user requested detailed information
  1093.                 if [ $SHOW_DETAILED_CONFIG -eq 0 ]; then
  1094.                     cat $CMGR_ERROR
  1095.                     cat $CMGR_OUTPUT | sed -e \
  1096.                         "/Failover Policy: ${fp_name}/d"
  1097.                     rm -f $CMGR_OUTPUT
  1098.                     rm -f $CMGR_ERROR
  1099.                 fi
  1100.             fi
  1101.  
  1102.             echo " "
  1103.  
  1104.             # Always show the resources in the resource group.
  1105.             run_cmgr_command show resources in resource_group \
  1106.                 ${GROUP[$grpidx]} in cluster $CLUSTER_NAME
  1107.             prependtab $CMGR_OUTPUT
  1108.             cat $CMGR_ERROR
  1109.             cat $CMGR_OUTPUT
  1110.             rm -f $CMGR_OUTPUT
  1111.             rm -f $CMGR_ERROR
  1112.  
  1113.             echo " "
  1114.             echo " "
  1115.  
  1116.  
  1117.             grpidx=`expr $grpidx + 1`
  1118.         done
  1119.     fi
  1120.  
  1121.     # If the user has requested detailed cluster information, obtain and
  1122.     # print the resources in the cluster and their status(optional)
  1123.     # and details.
  1124.     if [ $SHOW_DETAILED_CONFIG -eq 0 ]; then
  1125.         get_and_print_resources_in_cluster
  1126.     fi
  1127.  
  1128.  
  1129.     # Proceed to the next cluster
  1130.     clusteridx=`expr $clusteridx + 1`
  1131.     if [ $clusteridx -lt $NUMCLUSTERS ]; then
  1132.         echo " "
  1133.     fi
  1134.  
  1135. done
  1136.  
  1137. #
  1138. # If detailed configuration information is requested:
  1139. #
  1140.  
  1141. if [ $SHOW_DETAILED_CONFIG -eq 0 ]; then
  1142.  
  1143. # Show the failover_policies
  1144.  
  1145.     # Obtain the failover-policies
  1146.     get_failover_policies
  1147.     if [ $? -eq 0 ]; then     # Failover policies could be found
  1148.  
  1149.         #
  1150.         # Print the failover policies and their details.
  1151.         #
  1152.         policyidx=0
  1153.         while [ $policyidx -lt $NUMPOLICIES ]
  1154.         do
  1155.             echo "Failover_policy ${FAILOVER_POLICY[$policyidx]}:"
  1156.             echo " "
  1157.  
  1158.             run_cmgr_command show failover_policy \
  1159.                 ${FAILOVER_POLICY[$policyidx]}
  1160.             cat $CMGR_ERROR
  1161.             cat $CMGR_OUTPUT | sed -e \
  1162.                 "/Failover Policy: ${FAILOVER_POLICY[$policyidx]}/d"
  1163.             rm -f $CMGR_OUTPUT
  1164.             rm -f $CMGR_ERROR
  1165.             echo " "
  1166.             echo " "
  1167.  
  1168.             policyidx=`expr $policyidx + 1`
  1169.         done
  1170.     fi
  1171.  
  1172.  
  1173. # Show configuration and status as appropriate for nodes in pool but not
  1174. # in any cluster.
  1175.  
  1176.     # Obtain the nodes in the pool
  1177.     get_pool_nodes
  1178.     if [ $? -ne 0 ]; then
  1179.         # Pool nodes could not be obtained. Exit.
  1180.         # Error message is printed and cleanup is done in
  1181.         # function get_pool_nodes.
  1182.         exit 1
  1183.     fi
  1184.     
  1185.  
  1186.     #If a pool node is not in any cluster print its details.
  1187.     nodeidx=0
  1188.     while [ $nodeidx -lt $NUMNODES ]
  1189.     do
  1190.         cnodeidx=0
  1191.         while [ $cnodeidx -lt $NUMCNODES ]
  1192.         do
  1193.             if [ ${NODE[$nodeidx]} = ${CNODE[$cnodeidx]} ]; then
  1194.                 break
  1195.             fi
  1196.             cnodeidx=`expr $cnodeidx + 1`
  1197.         done
  1198.  
  1199.         if [ $cnodeidx -lt $NUMCNODES ]; then
  1200.             # Node in cluster. Skip node.
  1201.             nodeidx=`expr $nodeidx + 1`
  1202.             continue;
  1203.         fi
  1204.  
  1205.         # Node not in any cluster. Print status is desired and 
  1206.         # configuration information for the node.
  1207.  
  1208.         echo "Pool_node ${NODE[$nodeidx]}:"
  1209.         echo " "
  1210.  
  1211.         # Print status of node if requested.
  1212.         if [ $SHOW_STATUS -eq 0 ]; then
  1213.             run_cmgr_command show status of node ${NODE[$nodeidx]}
  1214.             prependtab $CMGR_OUTPUT
  1215.             cat $CMGR_ERROR
  1216.             cat $CMGR_OUTPUT
  1217.             rm -f $CMGR_OUTPUT
  1218.             rm -f $CMGR_ERROR
  1219.             echo " "
  1220.         fi
  1221.  
  1222.         # Print configuration information for the node.
  1223.         run_cmgr_command show node ${NODE[$nodeidx]}
  1224.         prependtab $CMGR_OUTPUT
  1225.         cat $CMGR_ERROR
  1226.         cat $CMGR_OUTPUT
  1227.         rm -f $CMGR_OUTPUT
  1228.         rm -f $CMGR_ERROR
  1229.         echo " "
  1230.  
  1231.         echo " "
  1232.  
  1233.         nodeidx=`expr $nodeidx + 1`
  1234.     done
  1235. fi
  1236.  
  1237. # Cleanup and exit 0 (success).
  1238.  
  1239. rm -f $CMGR_OUTPUT
  1240. rm -f $CMGR_ERROR
  1241. rm -f $CMGR_OUTPUT1
  1242. rm -f $CMGR_ERROR1
  1243. rm -f $TMPFILE
  1244.  
  1245. exit 0
  1246.  
  1247.